package com.wang.test.demo.test;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.CtNewMethod;
import javassist.Modifier;
public class CreateStudentClass {

    public static void main(String[] args) throws Exception {
        //ClassPool为Student类的容器
        ClassPool pool = ClassPool.getDefault();
        //通过ClassPool生成一个Student.java的新类
        CtClass studentClass = pool.makeClass("Student");
        //模仿从数据库获取到的字段
        List<String> cols = new ArrayList<String>();
        cols.add("name");
        cols.add("age");
        //首先添加类属性private String xxx
        for (String column : cols) {
            //student类属性
            CtField stuField = new CtField(pool.getCtClass("java.lang.String"), column, studentClass);
            //设置类修饰，public或private等
            stuField.setModifiers(Modifier.PRIVATE);
            //添加属性
            studentClass.addField(stuField);
            //为name和age属性添加getxxx和setxxx方法，column应该使用驼峰命名规则，即单词首字母大写(除第一个外)
            //    如getName,setName,这里没有使用，所以生成的是getname,setname
            studentClass.addMethod(CtNewMethod.getter("get"+column, stuField));
            studentClass.addMethod(CtNewMethod.setter("set"+column, stuField));
        }

        //使用我们创建的类设置属性值
        studentClass.setAttribute("name", "张三".getBytes());
        byte[] nameByte = studentClass.getAttribute("name");
        //设置student类的年龄
        studentClass.setAttribute("age", "30".getBytes());
        byte[] ageByte = studentClass.getAttribute("age");
        //输出设置的值
        System.out.println("名字："+new String(nameByte)+"===年龄:"+new String(ageByte));

        System.out.println(studentClass.toString());

        //把内存中的对象生成class文件并，也可以不写，注意：不能在输出之后使用studentClass对象，因为内存中已经没有了。
        byte[] bytArr = studentClass.toBytecode();
        FileOutputStream fos = new FileOutputStream(new File("D://Student.class"));
        fos.write(bytArr);
        fos.close();
    }
}
